package com.yanggu.sa_token.demo_application.config;

import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.stp.StpInterface;
import cn.hutool.v7.core.collection.CollUtil;
import cn.hutool.v7.json.JSONUtil;
import org.springframework.beans.factory.annotation.Value;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * sa-token 权限管理实现类
 */
public class SaPermissionImpl implements StpInterface {

    @Value("${sa-token.token-name}")
    private String tokenName;

    /**
     * 返回一个账号所拥有的权限码集合
     *
     * @param loginId   账号id
     * @param loginType 账号类型
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {

        // 1. 声明权限码集合
        Set<String> set = new HashSet<>();

        // 2. 遍历角色列表，查询拥有的权限码
        for (String roleId : getRoleList(loginId, loginType)) {
            String key = tokenName + ":role-find-permission:" + roleId;
            String jsonArray = SaManager.getSaTokenDao().get(key);
            List<String> permissionList = JSONUtil.toList(jsonArray, String.class)
                    .stream()
                    .distinct()
                    .toList();
            if (CollUtil.isEmpty(permissionList)) {
                // 从数据库查询这个角色 id 所拥有的权限列表
                permissionList = List.of("user:add", "user:update", "user:delete");
                // 查好后，set 到缓存中
                SaManager.getSaTokenDao().setObject(key, permissionList, 60 * 60 * 24);
            }
            if (CollUtil.isNotEmpty(permissionList)) {
                set.addAll(permissionList);
            }
        }

        // 3. 返回权限码集合
        return set.stream().toList();
    }

    /**
     * 返回一个账号所拥有的角色标识集合
     *
     * @param loginId   账号id
     * @param loginType 账号类型
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        String key = tokenName + ":loginId-find-role:" + loginId;
        String jsonArray = SaManager.getSaTokenDao().get(key);
        List<String> roleList = JSONUtil.toList(jsonArray, String.class)
                .stream()
                .distinct()
                .toList();
        if (CollUtil.isEmpty(roleList)) {
            // 从数据库查询这个账号id拥有的角色列表，
            roleList = List.of("admin", "user");
            // 查好后，set 到缓存中
            SaManager.getSaTokenDao().setObject(key, roleList, 60 * 60 * 24);
        }
        return roleList;
    }

}
